module decoder(
	input				clk_in,
	input				rst_n,
	input		[15:0]	W_CMD,		//写地址
	input		[15:0]	R_CMD,		//读地址

	input		[31:0]	R_DATA1,	//数据指令
	input		[31:0]	R_DATA2,

	output	reg	[31:0]	W_DATA1,
	output	reg	[31:0]	W_DATA2,

/*-----------------------------ADCA-----------------------------*/
	output	reg			enWrA,
	output	reg	[23:0]	WrAdcA,
	output	reg	[7:0]	rdA_CH,
	output	reg	[13:0]	divinumA,

	input		[11:0]	DataOutA_CH1,
	input		[11:0]	DataOutA_CH2,
	input		[11:0]	DataOutA_CH3,
	input		[11:0]	DataOutA_CH4,
	input		[11:0]	DataOutA_CH5,
	input		[11:0]	DataOutA_CH6,
	input		[11:0]	DataOutA_CH7,
	input		[11:0]	DataOutA_CH8,

	output	reg	[7:0]	enFIFORstA,
	output	reg			LVRst_nA,

/*-----------------------------ADCB-----------------------------*/
	output	reg			enWrB,
	output	reg	[23:0]	WrAdcB,
	output	reg	[7:0]	rdB_CH,
	output	reg	[13:0]	divinumB,

	input		[11:0]	DataOutB_CH1,
	input		[11:0]	DataOutB_CH2,
	input		[11:0]	DataOutB_CH3,
	input		[11:0]	DataOutB_CH4,
	input		[11:0]	DataOutB_CH5,
	input		[11:0]	DataOutB_CH6,
	input		[11:0]	DataOutB_CH7,
	input		[11:0]	DataOutB_CH8,

	output	reg	[7:0]	enFIFORstB,
	output	reg			LVRst_nB,



/*--------------------------------触发所需的信号--------------------------------*/
	output	reg 		VerusTriggerA,
	output	reg [13:0]	TriggerRangeA,
	output	reg [12:0]	TriggerLVA,
	output	reg [7:0]	Trigger_CHA,
	output	reg [1:0]	TriggerModeA,
	
	output	reg 		VerusTriggerB,
	output	reg [13:0]	TriggerRangeB,
	output	reg [12:0]	TriggerLVB,
	output	reg [7:0]	Trigger_CHB,
	output	reg [1:0]	TriggerModeB,

/*-----------------------------test-----------------------------*/
	input		[11:0]	q_out,
	output	reg			enTst,

	input		[13:0]	rd_ram0,
	output	reg [14:0]	rd_ram,

	output	reg	[31:0]	test_port

);

//reg[31:0] test_port;//test_port

always@(posedge clk_in or negedge rst_n)   //
begin
	if(!rst_n)
	begin
		test_port	<= 32'h0;

		enWrA		<= 1'b0;
		WrAdcA		<= 24'h0;
		rdA_CH		<= 8'h0;
		enFIFORstA	<= 8'h0;
		LVRst_nA	<= 1'b0;
		divinumA	<= 14'h0;

		enWrB		<= 1'b0;
		WrAdcB		<= 24'h0;
		rdB_CH		<= 8'h0;
		enFIFORstB	<= 8'h0;
		LVRst_nB	<= 1'b0;
		divinumB	<= 14'h0;
	end
	else
	begin
		case(R_CMD)

		16'h1011:begin
				test_port	<= R_DATA1;
			end
		16'h1012:begin
				enTst		<= R_DATA1[0];
			end
/*--------------------------------ADCA--------------------------------*/
/*--------------------------------ADCA--------------------------------*/
/*--------------------------------ADCA--------------------------------*/
//write to ADCA register
		16'h1101:begin
				enWrA		<= 1'b0;
				WrAdcA		<= R_DATA1[23:0];
			end
		16'h1102:begin
				enWrA		<= 1'b1;
			end
//

//rdclk of The FIFO
		16'h1103:begin
				rdA_CH		<= R_DATA1[7:0];
			end
//

//reset The FIFO
		16'h1104:begin
				enFIFORstA	<= R_DATA1[7:0];
			end
//

//reset The ALTLVDS
		16'h1105:begin
				LVRst_nA	<= R_DATA1[0];
			end
//

/*--------------------------------trigger--------------------------------*/
//Sampling Rate
		16'h1106:begin
				divinumA	<= R_DATA1[13:0];
			end
//
////triggerchoose
//		16'h1107:begin
//				Trigger_CHA	<= R_DATA1[7:0];
//			end
////
//TriggerLV
		16'h1107:begin
				TriggerLVA	<= R_DATA1[12:0];
			end
//

//Pre-stored depth
		16'h1108:begin
				TriggerRangeA	<= R_DATA1[13:0];
			end
//
//VerusTrigger
		16'h1109:begin
				Trigger_CHA		<= R_DATA1[7:0];
			end
//
//VerusTrigger
		16'h1110:begin
				TriggerModeA		<= R_DATA1[1:0];
			end
//

/*--------------------------------ADCB--------------------------------*/
/*--------------------------------ADCB--------------------------------*/
/*--------------------------------ADCB--------------------------------*/
//write to ADCB register
		16'h1201:begin
				enWrB		<= 1'b0;
				WrAdcB		<= R_DATA1[23:0];
			end
		16'h1202:begin
				enWrB		<= 1'b1;
			end
//

//rdclk of The FIFO
		16'h1203:begin
				rdB_CH		<= R_DATA1[7:0];
			end
//

//reset The FIFO
		16'h1204:begin
				enFIFORstB	<= R_DATA1[7:0];
			end
//

//reset The ALTLVDS
		16'h1205:begin
				LVRst_nB	<= R_DATA1[0];
			end
//

/*--------------------------------trigger--------------------------------*/
//Sampling Rate
		16'h1206:begin
				divinumB	<= R_DATA1[13:0];
			end
//
////triggerchoose
//		16'h1207:begin
//				Trigger_CHB	<= R_DATA1[7:0];
//			end
////
//TriggerLV
		16'h1207:begin
				TriggerLVB	<= R_DATA1[12:0];
			end
//

//Pre-stored depth
		16'h1208:begin
				TriggerRangeB	<= R_DATA1[13:0];
			end
//
//VerusTrigger
		16'h1209:begin
				Trigger_CHB		<= R_DATA1[7:0];
			end
//
//VerusTrigger
		16'h1210:begin
				TriggerModeB		<= R_DATA1[1:0];
			end
//



//读ram地址
		16'h1301:begin
				rd_ram		<= R_DATA1[14:0];
			end
//

		default:
			begin
				test_port	<= test_port;

				enWrA		<= enWrA;
				WrAdcA		<= WrAdcA;
				rdA_CH		<= rdA_CH;
				enFIFORstA	<= enFIFORstA;
				LVRst_nA	<= LVRst_nA;
				divinumA	<= divinumA;

				enWrB		<= enWrB;
				WrAdcB		<= WrAdcB;
				rdB_CH		<= rdB_CH;
				enFIFORstB	<= enFIFORstB;
				LVRst_nB	<= LVRst_nB;
				divinumB	<= divinumB;
			end

		endcase

		case(W_CMD)
		16'h0011:begin		//
				W_DATA1	<= test_port;
			end
		16'h0001:begin		//
				W_DATA1	<= 32'h03040001;
			end
		16'h0002:begin		//
				W_DATA1	<= {20'h0,q_out};
			end
/*--------------------------------ADCA--------------------------------*/ // CH1
		16'h0101:begin		//
				rdA_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutA_CH1};
			end
		16'h0102:begin		//
				rdA_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutA_CH2};
			end
		16'h0103:begin		//
				rdA_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutA_CH3};
			end
		16'h0104:begin		//
				rdA_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutA_CH4};
			end
		16'h0105:begin		//
				rdA_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutA_CH5};
			end
		16'h0106:begin		//
				rdA_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutA_CH6};
			end
		16'h0107:begin		//
				rdA_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutA_CH7};
			end
		16'h0108:begin		//
				rdA_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutA_CH8};
			end
/*--------------------------------ADCB--------------------------------*/ // CH2
		16'h0201:begin		//
				rdB_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutB_CH1};
			end
		16'h0202:begin		//
				rdB_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutB_CH2};
			end
		16'h0203:begin		//
				rdB_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutB_CH3};
			end
		16'h0204:begin		//
				rdB_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutB_CH4};
			end
		16'h0205:begin		//
				rdB_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutB_CH5};
			end
		16'h0206:begin		//
				rdB_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutB_CH6};
			end
		16'h0207:begin		//
				rdB_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutB_CH7};
			end
		16'h0208:begin		//
				rdB_CH	<= 8'h0;
				W_DATA1	<= {20'h0,DataOutB_CH8};
			end

			
		16'h0301:begin		//
				W_DATA1	<= {18'h0,rd_ram0};
			end

/*----------------------------------------------------------------*/ //
		default:begin
				W_DATA1	<= W_DATA1;
				W_DATA2	<= W_DATA2;
			end

		endcase
	end
end

// always@(posedge clk_in or negedge rst_n)   //
// begin
// 	if(!rst_n)
// 	begin
// 		W_DATA1	<= 32'h0;
// 		W_DATA2	<= 32'h0;
// 	end
// 	else
// 	begin
// 		case(W_CMD)
// 		16'h0011:begin		//
// 				W_DATA1	<= test_port;
// 			end
// 		16'h0001:begin		//
// 				W_DATA1	<= 32'h03040001;
// 			end
// 		16'h0002:begin		//
// 				W_DATA1	<= {20'h0,q_out};
// 			end
// /*--------------------------------ADCA--------------------------------*/ // CH1
// 		16'h0101:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutA_CH1};
// 			end
// 		16'h0102:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutA_CH2};
// 			end
// 		16'h0103:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutA_CH3};
// 			end
// 		16'h0104:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutA_CH4};
// 			end
// 		16'h0105:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutA_CH5};
// 			end
// 		16'h0106:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutA_CH6};
// 			end
// 		16'h0107:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutA_CH7};
// 			end
// 		16'h0108:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutA_CH8};
// 			end
// /*--------------------------------ADCB--------------------------------*/ // CH2
// 		16'h0201:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutB_CH1};
// 			end
// 		16'h0202:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutB_CH2};
// 			end
// 		16'h0203:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutB_CH3};
// 			end
// 		16'h0204:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutB_CH4};
// 			end
// 		16'h0205:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutB_CH5};
// 			end
// 		16'h0206:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutB_CH6};
// 			end
// 		16'h0207:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutB_CH7};
// 			end
// 		16'h0208:begin		//
// 				rdA_CH	<= 8'h0;
// 				W_DATA1	<= {20'h0,DataOutB_CH8};
// 			end

			
// 		16'h0301:begin		//
// 				W_DATA1	<= {18'h0,rd_ram0};
// 			end

// /*----------------------------------------------------------------*/ //
// 		default:begin
// 				W_DATA1	<= W_DATA1;
// 				W_DATA2	<= W_DATA2;
// 			end

// 		endcase
// 	end
// end

endmodule
